[Amazon SageMaker] デフォルトのハイパーパラメータでお菓子を検出してみました
1 はじめに
CX事業本部の平内(SIN)です。
Amazon SageMaker(以下、SageMaker)では、ハイパーパラメータ調整(以下、HPO)で、多数のトレーニングを実行して最適なモデルを作成することができます。しかし、多数の学習を行うので、それなりに、時間と費用が発生することは否定できません。
最近、組み込みアルゴリズムの物体検出(object-detection)でHPOを色々試す中、SageMakerのコンソールから使用した場合のデフォルトのハイパーパラメータ値が、凄くいい感じになっている事に気が付いてしまいました。
今回は、デフォルトの値を可能な限り変更しないで、モデルを作成する一連の手順を記事とさせて頂きました。
検出の対象は、「ビスコ」と「ブラックサンダー」と「アルフォート」の3種類です。
なお、ここDevelopers.IOでは、既にオブジェクト検出について素晴らしい記事が多数あります。
参考にさせて頂いたリンク
Amazon SageMakerでネジ画像の分類をやってみた_データを増やしてみた
Amazon SageMakerで複数のネジの検出と分類をやってみた
Amazon SageMakerを使って商品の検出モデルを作成してみた
2 VoTTによるデータセット作成
データセットの作成には、VoTT (Visual Object Tagging Tool)を利用させて頂きました。
Webカメラを使用して、800×600で約100枚の画像を撮影し、以下の3種類のラベルを付与しました。
- BlackThunder
- Bisco
- Alfort
各画像には、お菓子がそれぞれ、0〜3個写っており、アノテーション情報は、各ラベル200個程度となっています。
3 RecordIOへの変換
VoTTで作成したデータは、オブジェクト検出アルゴリズムで利用可能なデータセットのうち、最も推奨とされているRecordIO形式に変換しました。
VoTT形式 => ① => Ground Truth形式 => ③ => RecordIO形式
参考:[Amazon SageMaker] オブジェクト検出におけるGround Truthを中心としたデータセット作成環境について
参考:① VoTTで作成したデータをCustom Labelsで利用可能なAmazon SageMaker Ground Truth形式に変換してみました
参考:③ Amazon SageMaker Ground Truth で作成したデータをオブジェクト検出で利用可能なRecordIO形式に変換してみました
学習と検証用に、8:2に分けたので、データ数(画像数)としては、学習用(train)が80、検証用(validation)が21となっています。
RecordIO形式のデータは、S3にアップロードしました。
4 学習ジョブの作成
Traning > Training jobs > Create traning job で学習ジョブを作成します。
(1) アルゴリズム
Job nameを適当に付けた後、Choose an algorithmで、Object Detectionを選択します。 inputModeは、処理が早く進むようにPipeとしました。
(3) CPU
オブジェクト検出アルゴリズムでは、GPUインスタンスのみがサポートされているので、instance typeを ml.p3.2xlargeとしました。
(4) ハイパーパラメータ
どうしても設定が必要な以下の値のみを編集し、その他は、デフォルトのままとしました。
- num_classes: 3 (データセットには、3種類のお菓子がクラスとして設定されているため)
- ephochs: 50 (データ数が少ないので、デフォルトの30から50に増やしました)
- mini_batch_size: 21(1回のバッチ処理数は、検証データ数を超えることが出来ないため、デフォルトの32から21に減らしました)
- num_traning_samples: 80(学習データの数なので、80を設定しました)
(5) データセットの指定
データセットの指定は、以下のとおりです。Content typeをapplication/x-recordioとし、S3のURLを指定しています。
(6) アウトプットの指定
モデルの出力先となるS3のURLは、データセットが置かれている所にしています。
(7) 学習
Create traning Jobで学習が開始します。
ジョブの一覧で、StatusがCompletedになったら、完了です。
5 テスト
学習は、3分弱(160sec)で完了し、最終的なmAPは、0.949となりました。Epoch回数を増やしたことで、0.9を超えるところまで来ましたが、40を超えたあたりから殆どスコアは上がっていないようでした。
下記は、CloudWatch Logsから生成したレポートです。
参考:[Amazon SageMaker] CloudWatch Logsからcross_entropyやmAPのスコアを取得して一覧してみました
epoch mAP smooth_l1 cross_entropy ----------------------------------------- 0 0.0 0.792 3.542 10 0.118 0.562 1.209 20 0.755 0.486 0.842 30 0.889 0.42 0.723 35 0.916 0.381 0.691 40 0.923 0.331 0.607 45 0.942 0.323 0.592 49 0.949 0.322 0.561
作成されたモデルは、Jupyter Notebookから作業してデプロイし、モデル作成に使用していない画像で試してみました。mAPが、0.94ということで、悪くない結果となっています。
参考:【小ネタ】[Amazon SageMaker] 既存のモデルのデプロイをJupyter Notebookでやってみました
最後に
今回は、デフォルトの値を可能な限り変更しないで、物体検出のモデルを作成してみました。比較的少量のデータセットでしたが、それなりに精度が出たようです。
ハイパーパラメータで適切な値を選定することは、非常にコストの高いものとなりますが、とりあえずは、デフォルト値のままでも結構精度が出せるのではと感じました。